home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
iguana
/
incosrc
/
incosrc.exe
/
MIRRBALL
/
PATH
/
PATH.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-06-18
|
6KB
|
252 lines
USES Matrix;
FUNCTION POW2(a : DOUBLE): DOUBLE;
BEGIN
POW2 := a*a
END;
FUNCTION POW3(a : DOUBLE): DOUBLE;
BEGIN
POW3 := a*a*a
END;
FUNCTION TAN(a : DOUBLE): DOUBLE;
BEGIN
TAN := Sin(a)/Cos(a)
END;
{ --------------------------------- }
TYPE
Pt = RECORD
f, t, slope : DOUBLE;
a, b, c, d : DOUBLE
END;
PtArray = RECORD
npts : INTEGER;
pts : ARRAY [1..200] OF Pt;
END;
PROCEDURE CalcSlopes(VAR pa: PtArray);
VAR
i : INTEGER;
BEGIN
FOR i := 1 TO pa.npts DO BEGIN
IF i = 1 THEN
pa.pts[i].slope := (pa.pts[i+1].f-pa.pts[i].f) /
(pa.pts[i+1].t-pa.pts[i].t)
ELSE IF i = pa.npts THEN
pa.pts[i].slope := (pa.pts[i].f-pa.pts[i-1].f) /
(pa.pts[i].t-pa.pts[i-1].t)
ELSE
pa.pts[i].slope := TAN(
(ARCTAN((pa.pts[i+1].f-pa.pts[i].f) /
(pa.pts[i+1].t-pa.pts[i].t)) +
ARCTAN((pa.pts[i].f-pa.pts[i-1].f) /
(pa.pts[i].t-pa.pts[i-1].t)))/2);
{ pa.pts[i].slope := (pa.pts[i+1].f-pa.pts[i-1].f) /
(pa.pts[i+1].t-pa.pts[i-1].t);
} WriteLn('Pendiente calculada: ', pa.pts[i].slope);
END
END;
PROCEDURE CalcCoeffs(VAR pa: PtArray);
VAR
i : INTEGER;
ma, m1 : Matrix4x4;
da, d1 : DOUBLE;
b : Column4;
BEGIN
CalcSlopes(pa);
ma[4,1] := 1;
ma[4,2] := 1;
ma[3,3] := 1;
ma[3,4] := 1;
ma[4,3] := 0;
ma[4,4] := 0;
FOR i := 1 TO pa.npts-1 DO BEGIN
b[1] := pa.pts[i].f;
b[2] := pa.pts[i+1].f;
b[3] := pa.pts[i].slope;
b[4] := pa.pts[i+1].slope;
ma[3,1] := pa.pts[i].t;
ma[3,2] := pa.pts[i+1].t;
ma[2,3] := pa.pts[i].t*2;
ma[2,4] := pa.pts[i+1].t*2;
ma[2,1] := POW2(pa.pts[i].t);
ma[2,2] := POW2(pa.pts[i+1].t);
ma[1,3] := POW2(pa.pts[i].t)*3;
ma[1,4] := POW2(pa.pts[i+1].t)*3;
ma[1,1] := POW3(pa.pts[i].t);
ma[1,2] := POW3(pa.pts[i+1].t);
da := Determinante4(ma);
PrepareMatrix(m1, ma, b, 1);
d1 := Determinante4(m1);
pa.pts[i].a := d1/da;
PrepareMatrix(m1, ma, b, 2);
d1 := Determinante4(m1);
pa.pts[i].b := d1/da;
PrepareMatrix(m1, ma, b, 3);
d1 := Determinante4(m1);
pa.pts[i].c := d1/da;
PrepareMatrix(m1, ma, b, 4);
d1 := Determinante4(m1);
pa.pts[i].d := d1/da;
WriteLn('Calculados coeficientes del segmento ',i, ',')
END;
END;
{ ----------------------------------- }
FUNCTION Interpolate(VAR pf: PtArray; x : DOUBLE): DOUBLE;
VAR
i : INTEGER;
BEGIN
Interpolate := 0;
FOR i := 2 TO pf.npts-2 DO
IF (x >= pf.pts[i].t) AND (x <= pf.pts[i+1].t) THEN
Interpolate := pf.pts[i].a*POW3(x) +
pf.pts[i].b*POW2(x) +
pf.pts[i].c* x +
pf.pts[i].d
END;
{ ----------------------------------- }
VAR
PF1, PF2 : PtArray;
PROCEDURE ReadPtList(VAR fi: TEXT);
VAR
i : INTEGER;
t, f1, f2 : DOUBLE;
BEGIN
i := 1;
WHILE (i <= 200) AND NOT Eof(fi) DO BEGIN
t := -1;
ReadLn(fi, t, f1, f2);
IF t < 0 THEN BEGIN
PF1.npts := i-1;
PF2.npts := i-1;
EXIT
END;
PF1.pts[i].t := t;
PF2.pts[i].t := t;
PF1.pts[i].f := f1;
PF2.pts[i].f := f2;
WriteLn('Leido...');
INC(i)
END;
PF1.npts := i-1;
PF2.npts := i-1
END;
{ ----------------------------------- }
TYPE
TScr = ARRAY[0..199,0..319] OF BYTE;
VAR
Screen : TScr ABSOLUTE $A000:0;
PROCEDURE Usage;
BEGIN
WriteLn('Cubic Spline Generator v0.5, (C) 1993 bye Jare/Iguana');
WriteLn(' Usage: PATH nsteps [infile]');
HALT
END;
VAR
i : INTEGER;
fi : TEXT;
t, x, y : DOUBLE;
NFrames : INTEGER;
CONST
MI : Matrix4x4 = ((1.0, 2.0, 3.0, 4.0),
(5.0, 9.0, 8.0, 7.0),
(3.0, 2.0, 1.0, 9.0),
(4.0, 2.0, 6.0, 7.0));
BEGIN
IF (ParamCount < 1) OR (ParamCount > 2) THEN
Usage;
VAL(ParamStr(1), NFrames, i);
IF i <> 0 THEN
Usage;
IF ParamCount = 2 THEN BEGIN
Assign(fi, ParamStr(2));
Reset(fi);
ReadPtList(fi);
Close(fi)
END ELSE
ReadPtList(input);
WriteLn('Prueba.... |I| = ', Determinante4(MI));
WriteLn(' Número de puntos : ', PF1.npts);
WriteLn('-------------------------');
FOR i := 1 TO PF1.npts DO
WriteLn(PF1.pts[i].t:10, PF2.pts[i].t:10, ' | ',
PF1.pts[i].f:10, PF2.pts[i].f:10);
CalcCoeffs(PF1);
CalcCoeffs(PF2);
ASM
MOV AX,0
INT 16h
MOV AX,13h
INT 10h
END;
FOR i := 0 TO NFrames-1 DO BEGIN
t := i*(PF1.pts[PF1.npts-1].t - PF1.pts[2].t)/NFrames +
PF1.pts[2].t;
x := Interpolate(PF1,t);
y := Interpolate(PF2,t);
Screen[ROUND(t), ROUND(x)] := 12;
Screen[ROUND(t), ROUND(y)] := 13;
Screen[ROUND(y), ROUND(x)] := 15
END;
FOR i := 2 TO PF1.npts-1 DO BEGIN
y := PF1.pts[i].t;
x := PF1.pts[i].f;
Screen[ROUND(y), ROUND(x)] := 14;
x := PF2.pts[i].f;
Screen[ROUND(y), ROUND(x)] := 14
END;
ASM
MOV AX,0
INT 16h
MOV AX,3
INT 10h
END;
END.